import re
from typing import Optional

from app.schemas.base_schema import LoginAccountType


def validate_phone_number(value: str) -> str | None:
    if value is None:
        return None
    if not re.match(r"^1[3-9]\d{9}$", value):
        raise ValueError("手机号格式不正确")
    return value


def validate_email(value: str) -> str | None:
    if value is None:
        return None
    if not re.match(r"^[\w.-]+@[\w.-]+\.\w+$", value):
        raise ValueError("邮箱格式不正确")
    return value


def validate_password(password: str, confirm_password:str) -> str | None:
    if password is None:
        return None
    if not re.match(r"^[a-zA-Z][a-zA-Z0-9*_-]{5,}$", password):
        raise ValueError(
            "密码必须以大小字母或者数字开头，长度大于等于6位，可以包含大小写字母、数字，以及'_'、'-'、'*'等特殊字符"
        )
    if password != confirm_password:
        raise ValueError("确认密码与密码不一致")
    return password


def validate_username(value: str) -> str:
    if not re.match(r"^[a-zA-Z][a-zA-Z0-9*_]{2,}$", value):
        raise ValueError(
            "用户名必须以大小字母开头，长度大于等于3位，可以包含大小写字母、数字，以及'_'、'-'、'*'等特殊字符"
        )
    return value

def validate_account(value: str,account_type:Optional[LoginAccountType]=None) -> LoginAccountType:
    if value is None:
        raise ValueError("请检查账户是否正确")
    if account_type is not None:
        if account_type == LoginAccountType.phone_number:
            validate_phone_number(value)
            return LoginAccountType.phone_number
        elif account_type == LoginAccountType.email:
            validate_email(value)
            return LoginAccountType.email
        elif account_type == LoginAccountType.username:
            validate_username(value)
            return LoginAccountType.username

    if re.match(r"^1[3-9]\d{9}$", value):
        # 如果账户是手机号
        return LoginAccountType.phone_number
    elif re.match(r"^[\w.-]+@[\w.-]+\.\w+$", value):
        # 如果账户是邮箱
        return LoginAccountType.email
    elif re.match(r"^[a-zA-Z][a-zA-Z0-9*_]{2,}$", value):
        # 如果账户是用户名
        return LoginAccountType.username
    else:
        raise ValueError("请检查账户是否正确")

